package hash

import (
	"crypto/md5"
	"fmt"
	"io"
	"math"
	"os"
	"strconv"
)

const chunkSize int64 = 1 << 10
const bigChunkSize int64 = 4 << 30

func GetMd5(f []byte) []byte {
	hash := md5.New()
	_, err := hash.Write(f)
	if err != nil {
		fmt.Println(err)
	}
	result := hash.Sum(nil)
	return result
}

func GetMd5OfFile(fileName string) string {
	// 由于调用时已校验过文件存在，因此不处理错误
	file, _ := os.Open(fileName)
	md5h := md5.New()
	io.Copy(md5h, file)
	hash := string(md5h.Sum(nil))
	return hash
}

// 其实是个测试，但是先放着吧
func Getfile(fileName string, chunkSize int64) error {
	// 获取文件参数，校验文件存在性
	fileInfo, err := os.Stat(fileName)
	if err != nil {
		fmt.Printf("文件不存在，err：%v", err)
	}
	// 小文件个数
	num := int(math.Ceil(float64(fileInfo.Size()) / float64(chunkSize)))

	fi, err := os.OpenFile(fileName, os.O_RDONLY, os.ModePerm)
	if err != nil {
		fmt.Println(err)
		return err
	}

	b := make([]byte, chunkSize)
	for i := int64(1); i <= int64(num); i++ {
		fi.Seek((i-1)*(chunkSize), 0)
		if len(b) > int(fileInfo.Size()-(i-1)*chunkSize) {
			b = make([]byte, fileInfo.Size()-(i-1)*chunkSize)
		}
		fi.Read(b)
		f, err := os.OpenFile("./"+strconv.Itoa(int(i))+".db", os.O_CREATE|os.O_WRONLY, os.ModePerm)
		if err != nil {
			fmt.Println(err)
			return err
		}
		f.Write(b)
		fmt.Printf("%x\n", GetMd5(b))
		f.Close()
	}
	fi.Close()
	fmt.Println()
	return nil
}
